/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MailCliente;

import LibreriaServer.LServer;
import mailserver.MailServer1;
import Message.Mensaje;
import Persistencia.ArchivoDatos;
import SwConfMessage.Interfaz.IGuardarRecuperar;
import SwConfMessage.Interfaz.IMailCliente;
import SwConfMessage.Interfaz.IMensaje;
import SwConfMessage.Interfaz.IMostrar;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 * @author Marisol
 *
 * * @version 1.0.1 14 de Diciembre de 2013
 */
public class MailCliente implements IMailCliente {

    private IMostrar Server;
    private String Name;
    private ArrayList<Mensaje> listaMensajesCliente;

    /**
     * Construtor recibe el nombre del usuario y el servidor.
     *
     * @param Name
     * @param Server
     */
    public MailCliente(String Name, IMostrar Server) {
        try {
            this.Server = Server;
            this.Name = Name;

            ArchivoDatos<MailCliente> binariocliente = new ArchivoDatos<>();

            if (binariocliente.existe(LServer.patchUser(), Name, LServer.Dir)) {
                recuperar();
                return;
            }

            listaMensajesCliente = new ArrayList<Mensaje>();
            guardar();

        } catch (Exception ex) {
            Logger.getLogger(MailCliente.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public IMostrar getServer() {
        return Server;
    }

    public String getName() {
        return Name;
    }

    public ArrayList<Mensaje> getListaMensajesCliente() {
        return listaMensajesCliente;
    }

    /**
     * Este metodo consulta al servidor a fin de ver si el usuario tiene algun
     * mensaje. este metodo retorna unicamente la cantidad de mensajes que tiene
     * el usuario.
     *
     * @return
     */
    @Override
    public int checkMessages() {
        return ((MailServer1) Server).getMessagesWaitting(Name);
    }

    /**
     * Este metodo obtiene el siguiente mensajes del servidor y muestra el
     * mensaje al usuario.
     *
     * @return
     */
    @Override
    public IMensaje readNextMessage() {
        return (((MailServer1) Server).getNextMessage(Name));
    }

    /**
     * Este metodo metodo obtiene el mensaje completo del usuario con los datos
     * del destinatario,asunto,mensaje.
     *
     * @param Destino
     * @param Asunto
     * @param Mensaje
     */
    @Override
    public void sendMessage(String Destino, String Asunto, String Mensaje) {
        Mensaje mensaje = new Mensaje(Name, Destino, Asunto, Mensaje);
        ((MailServer1) (Server)).post(mensaje);
    }

    
    
    public void sendMessage(Mensaje mensaje) {
        listaMensajesCliente.add(mensaje);
        guardar();
    }

    private void crearCuenta(String nameUser, String nameServer) {
        FileWriter escribir = null;
        try {
            File archivo = new File(nameServer + "/" + nameUser + ".txt");
            escribir = new FileWriter(archivo, true);

            escribir.write("Mensajes de " + nameUser);
            escribir.close();
        } catch (IOException ex) {
            Logger.getLogger(MailCliente.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                escribir.close();
            } catch (IOException ex) {
                Logger.getLogger(MailCliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

//    public void Guardar() {
////        ArrayList listadatos = new ArrayList();
//
//        try {
//            ArchivoDatos archivo = new ArchivoDatos();
////            listadatos.add();
//            String nameServer = ((MailServer1) Server).nameServer();
//            archivo.guardarDatos(Name + nameServer, this);
//        } catch (Exception ex) {
//            Logger.getLogger(MailCliente.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
//    public void recuperar(String name) throws Exception {
//        ArchivoDatos archivo = new ArchivoDatos();
//        MailCliente cliente = (MailCliente) archivo.recuperar(LServer.patchUser(), name, LServer.Dir);
//        this.Name = cliente.Name;
//
//        this.listaMensajesCliente = cliente.listaMensajesCliente;
//    }
    private void mensajesIguales(String mensaje1, String mensaje2, int posicion) {

        if (mensaje1.equals(mensaje2)) {
            listaMensajesCliente.remove(posicion);

        }

    }

    public void eliminarTexto(String namecliente, String texto) {

        int cantidadMensajes = listaMensajesCliente.size();
        while (cantidadMensajes > 0) {
            cantidadMensajes--;
            Mensaje mensaje = listaMensajesCliente.get(cantidadMensajes);
            mensajesIguales(mensaje.mensaje(), texto, cantidadMensajes);
        }
//        Guardar();
    }

    public static void main(String[] args) {
        // TODO code application logic here
    }

    @Override
    public void guardar() {
        try {
            String Pach = LServer.patchUser();
            ArchivoDatos<MailCliente> binarioClient = new ArchivoDatos<>();
            binarioClient.guardar(this, Pach, Name, LServer.Dir);
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void recuperar() {

        try {
            String Pach = LServer.patchUser();
            ArchivoDatos<MailCliente> binarioServer = new ArchivoDatos<>();
            MailCliente cliente = binarioServer.recuperar(Pach, Name, LServer.Dir);
            this.listaMensajesCliente = cliente.listaMensajesCliente;
//            this.Name= cliente.Name;
//            this.Server = cliente.Server;
        } catch (Exception ex) {
            Logger.getLogger(MailServer1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
